#include "state_machine.h"
#include <unistd.h>

// 显示帮助信息
void show_help() {
    printf("\n=== 状态机演示程序 ===\n");
    printf("可用命令:\n");
    printf("  1 - 发送 START 事件\n");
    printf("  2 - 发送 STOP 事件\n");
    printf("  3 - 发送 PAUSE 事件\n");
    printf("  4 - 发送 RESUME 事件\n");
    printf("  5 - 发送 ERROR 事件\n");
    printf("  6 - 发送 RESET 事件\n");
    printf("  7 - 发送 EXIT 事件\n");
    printf("  h - 显示帮助信息\n");
    printf("  s - 显示当前状态\n");
    printf("  q - 退出程序\n");
    printf("==================\n\n");
}

// 显示当前状态
void show_current_state(state_machine_t *sm) {
    printf("当前状态: %s\n", state_to_string(sm->current_state));
    printf("前一状态: %s\n", state_to_string(sm->previous_state));
}

// 自动演示模式
void auto_demo(state_machine_t *sm) {
    printf("\n=== 自动演示模式 ===\n");
    printf("演示状态机的典型操作流程...\n\n");
    
    // 演示序列
    event_t demo_events[] = {
        EVENT_START,    // IDLE -> INIT
        EVENT_START,    // INIT -> RUNNING
        EVENT_PAUSE,    // RUNNING -> PAUSE
        EVENT_RESUME,   // PAUSE -> RUNNING
        EVENT_ERROR,    // RUNNING -> ERROR
        EVENT_RESET,    // ERROR -> IDLE
        EVENT_START,    // IDLE -> INIT
        EVENT_START,    // INIT -> RUNNING
        EVENT_STOP,     // RUNNING -> IDLE
        EVENT_EXIT      // IDLE -> EXIT
    };
    
    int demo_size = sizeof(demo_events) / sizeof(event_t);
    
    for (int i = 0; i < demo_size; i++) {
        printf("\n--- 步骤 %d ---\n", i + 1);
        state_machine_process_event(sm, demo_events[i]);
        
        if (sm->current_state == STATE_EXIT) {
            printf("演示完成，状态机已退出\n");
            break;
        }
        
        sleep(1); // 暂停1秒便于观察
    }
}

int main(int argc, char *argv[]) {
    state_machine_t sm;
    char input;
    int auto_mode = 0;
    
    // 检查命令行参数
    if (argc > 1 && strcmp(argv[1], "-auto") == 0) {
        auto_mode = 1;
    }
    
    printf("状态机演示程序启动\n");
    printf("使用参数 -auto 可以运行自动演示模式\n\n");
    
    // 初始化状态机
    if (state_machine_init(&sm) != 0) {
        printf("状态机初始化失败\n");
        return -1;
    }
    
    if (auto_mode) {
        auto_demo(&sm);
        return 0;
    }
    
    show_help();
    show_current_state(&sm);
    
    printf("\n请输入命令 (输入 'h' 查看帮助): ");
    
    while (1) {
        scanf(" %c", &input);
        
        switch (input) {
            case '1':
                state_machine_process_event(&sm, EVENT_START);
                break;
            case '2':
                state_machine_process_event(&sm, EVENT_STOP);
                break;
            case '3':
                state_machine_process_event(&sm, EVENT_PAUSE);
                break;
            case '4':
                state_machine_process_event(&sm, EVENT_RESUME);
                break;
            case '5':
                state_machine_process_event(&sm, EVENT_ERROR);
                break;
            case '6':
                state_machine_process_event(&sm, EVENT_RESET);
                break;
            case '7':
                state_machine_process_event(&sm, EVENT_EXIT);
                if (sm.current_state == STATE_EXIT) {
                    printf("程序退出\n");
                    return 0;
                }
                break;
            case 'h':
            case 'H':
                show_help();
                break;
            case 's':
            case 'S':
                show_current_state(&sm);
                break;
            case 'q':
            case 'Q':
                printf("程序退出\n");
                return 0;
            default:
                printf("无效命令，输入 'h' 查看帮助\n");
                break;
        }
        
        if (sm.current_state != STATE_EXIT) {
            printf("\n请输入命令: ");
        }
    }
    
    return 0;
}